Scan the completion store again to look for complete-but-not-unique matches
authorFederico Mena Quintero <federico@gnu.org>
Thu, 13 Mar 2008 00:41:38 +0000 (00:41 +0000)
committerFederico Mena Quintero <federico@src.gnome.org>
Thu, 13 Mar 2008 00:41:38 +0000 (00:41 +0000)
Signed-off-by: Federico Mena Quintero <federico@gnu.org>
svn path=/trunk/; revision=19837

gtk/gtkfilechooserentry.c

index 9fbe0afb8a343f7d0607fe11e383ab4aa98de4ed..54c89ad0303d79473a8933aea261b44a1b28592a 100644 (file)
@@ -477,6 +477,10 @@ find_common_prefix (GtkFileChooserEntry *chooser_entry,
            && chooser_entry->current_folder_path != NULL
            && gtk_file_path_compare (parsed_folder_path, chooser_entry->current_folder_path) == 0);
 
+  gtk_file_path_free (parsed_folder_path);
+
+  /* First pass: find the common prefix */
+
   valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (chooser_entry->completion_store), &iter);
 
   while (valid)
@@ -501,16 +505,13 @@ find_common_prefix (GtkFileChooserEntry *chooser_entry,
            {
              gchar *p = *common_prefix_ret;
              const gchar *q = display_name;
-                 
+
              while (*p && *p == *q)
                {
                  p++;
                  q++;
                }
 
-             if (*p == '\0' || *q == '\0')
-               *is_complete_not_unique_ret = TRUE;
-
              *p = '\0';
 
              gtk_file_path_free (*unique_path_ret);
@@ -523,7 +524,35 @@ find_common_prefix (GtkFileChooserEntry *chooser_entry,
       valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (chooser_entry->completion_store), &iter);
     }
 
-  gtk_file_path_free (parsed_folder_path);
+  /* Second pass: see if the prefix we found is a complete match */
+
+  if (*common_prefix_ret != NULL)
+    {
+      valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (chooser_entry->completion_store), &iter);
+
+      while (valid)
+       {
+         gchar *display_name;
+         int len;
+
+         gtk_tree_model_get (GTK_TREE_MODEL (chooser_entry->completion_store),
+                             &iter,
+                             DISPLAY_NAME_COLUMN, &display_name,
+                             -1);
+         len = strlen (display_name);
+         g_assert (len > 0);
+
+         if (G_IS_DIR_SEPARATOR (display_name[len - 1]))
+           len--;
+
+         if (strncmp (*common_prefix_ret, display_name, len) == 0)
+           *is_complete_not_unique_ret = TRUE;
+
+         g_free (display_name);
+         valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (chooser_entry->completion_store), &iter);
+       }
+    }
+
   g_free (parsed_file_part);
 
   return TRUE;